package com.rickpan.controller;

import com.rickpan.common.ApiResponse;
import com.rickpan.dto.dashboard.*;
import com.rickpan.entity.FileInfo;
import com.rickpan.service.DashboardService;
import com.rickpan.utils.SecurityUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 首页Dashboard控制器
 * 提供首页统计数据、最近文件、收藏文件等信息
 */
@Slf4j
@RestController
@RequestMapping("/api/dashboard")
@RequiredArgsConstructor
@Tag(name = "Dashboard", description = "首页数据接口")
public class DashboardController {

    private final DashboardService dashboardService;

    /**
     * 获取首页统计数据
     */
    @GetMapping("/stats")
    @Operation(summary = "获取首页统计数据", description = "获取文件数量、存储使用量、分享数量等统计信息")
    public ApiResponse<DashboardStatsDTO> getDashboardStats() {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的首页统计数据", userId);

            DashboardStatsDTO stats = dashboardService.getDashboardStats(userId);
            return ApiResponse.success(stats);
        } catch (Exception e) {
            log.error("获取首页统计数据失败", e);
            return ApiResponse.error("获取统计数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取最近文件
     */
    @GetMapping("/recent-files")
    @Operation(summary = "获取最近文件", description = "获取用户最近访问或修改的文件列表")
    public ApiResponse<List<FileInfo>> getRecentFiles(
            @RequestParam(defaultValue = "10") Integer limit) {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的最近文件，限制数量: {}", userId, limit);

            List<FileInfo> recentFiles = dashboardService.getRecentFiles(userId, limit);
            return ApiResponse.success(recentFiles);
        } catch (Exception e) {
            log.error("获取最近文件失败", e);
            return ApiResponse.error("获取最近文件失败: " + e.getMessage());
        }
    }

    /**
     * 获取收藏文件
     */
    @GetMapping("/favorite-files")
    @Operation(summary = "获取收藏文件", description = "获取用户收藏的文件列表")
    public ApiResponse<List<FileInfo>> getFavoriteFiles(
            @RequestParam(defaultValue = "10") Integer limit) {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的收藏文件，限制数量: {}", userId, limit);

            List<FileInfo> favoriteFiles = dashboardService.getFavoriteFiles(userId, limit);
            return ApiResponse.success(favoriteFiles);
        } catch (Exception e) {
            log.error("获取收藏文件失败", e);
            return ApiResponse.error("获取收藏文件失败: " + e.getMessage());
        }
    }

    /**
     * 获取文件类型统计
     */
    @GetMapping("/file-type-stats")
    @Operation(summary = "获取文件类型统计", description = "获取用户文件按类型的统计信息")
    public ApiResponse<List<FileTypeStatsDTO>> getFileTypeStats() {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的文件类型统计", userId);

            List<FileTypeStatsDTO> fileTypeStats = dashboardService.getFileTypeStats(userId);
            return ApiResponse.success(fileTypeStats);
        } catch (Exception e) {
            log.error("获取文件类型统计失败", e);
            return ApiResponse.error("获取文件类型统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取分享统计
     */
    @GetMapping("/share-stats")
    @Operation(summary = "获取分享统计", description = "获取用户分享的统计信息")
    public ApiResponse<ShareStatsDTO> getShareStats() {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的分享统计", userId);

            ShareStatsDTO shareStats = dashboardService.getShareStats(userId);
            return ApiResponse.success(shareStats);
        } catch (Exception e) {
            log.error("获取分享统计失败", e);
            return ApiResponse.error("获取分享统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取首页完整数据
     */
    @GetMapping("/data")
    @Operation(summary = "获取首页完整数据", description = "一次性获取首页所有需要的数据")
    public ApiResponse<DashboardDataDTO> getDashboardData() {
        try {
            Long userId = SecurityUtils.getCurrentUserId();
            log.info("获取用户 {} 的首页完整数据", userId);

            DashboardDataDTO dashboardData = dashboardService.getDashboardData(userId);
            return ApiResponse.success(dashboardData);
        } catch (Exception e) {
            log.error("获取首页完整数据失败", e);
            return ApiResponse.error("获取首页数据失败: " + e.getMessage());
        }
    }
}
